<?php

namespace CHOMP\SGIBundle\PermisoChomp;
use CHOMP\SGIBundle\Entity\Empresa;
use CHOMP\SGIBundle\Entity\CuentaAnalitica;
use CHOMP\SGIBundle\Entity\PermisoAutorizacion;
use CHOMP\SGIBundle\Entity\Permiso;
use CHOMP\SGIBundle\Entity\Rol;
use CHOMP\SGIBundle\Entity\Autorizacion;
use Doctrine\ORM\EntityRepository;


class PermisoChomp 
{
	//entity manager
	private $em;

	public $permisoAutorizacionId;
	// Dice que se puede hacer (si Ver o Editar)
	public $accion;

	// Dice sobre que objeto puede hacerse
	public $objeto;

	// Si el permiso es sobre un campo especifico, dice cual es el campo
	public $campo ;

	// Dice sobre cuál registro se aplica el permiso (ALL = Todos o Id Especifico = unico registro)
	public $record;

	//Dice a que empresa aplica el permiso (ALL = Todas o Id Especifico = empresa especifica)
	public $empresa;
	public $nombreEmpresa;

	public $String_Value;
	public $permId;
	/**********************************
     * __construct
     *
     * 
     **********************************/	

	public function __construct(){    
		//$this->em = $em; 
		$permisoAutorizacionId = '';
		$accion = '';
		$objeto = '';
		$campo = '';
		$record = '';
		$empresa = '';
		$nombreEmpresa = '';
		$permId = '';
		$String_Value = '';

    }



    private function setPermisosIds($em){
		$permisos = $em->getRepository('CHOMPSGIBundle:Permiso')->createQueryBuilder('p')->getQuery()->getResult();

		foreach( $permisos as $perm){
			if ($perm -> getDescripcion() == 'Ver')
				$this->permId['Ver'] = $perm ;
			if ($perm -> getDescripcion() == 'Editar')
				$this->permId['Editar'] = $perm ;
			if ($perm -> getDescripcion() == 'Crear')
				$this->permId['Crear'] = $perm ;
		}

    }
	

	public function setAll(\CHOMP\SGIBundle\Entity\PermisoAutorizacion $pa, $em){ 
		$this -> accion = $pa -> getPermiso()->getDescripcion();
		$this -> permisoAutorizacionId = $pa -> getId();
		$this -> objeto = $pa -> getAutorizacion()->getObjeto();
		$this -> campo = $pa -> getAutorizacion()->getCampo();
		$this -> empresa = $pa -> getAutorizacion()->getEmpresa();
		
		$this -> em = $em;
		if ($this->empresa!= '')
			$this -> setNombreEmpresa ($this -> empresa);
		else
			$this->nombreEmpresa = 'Vacio en dataloader. Arreglar.';
		return $this;
	}

	public function __toString(){
		return 'VER_EMPRESA_ALL_EMP:ALL';
	} 

	public function settheString_Value(){
		$this->String_Value = 'VER_EMPRESA_ALL_EMP:ALL';
	}


	public function setEmpresa($e){ 
		$this -> empresa = $e;
	}

	/*
		setea el nombre de la empresa que se muestra
		en la lista de permisos
	*/
	public function setNombreEmpresa($id){

		if ($id != 'ALL'){
			
			$resu = $this -> em -> createQuery(
											'SELECT u.nombre 
											   FROM CHOMPSGIBundle:Empresa u
											  WHERE u.id = :id'
											)-> setParameter('id', $id) -> getResult() ;
			
			if ($resu != null){
				foreach ($resu as $emp)
					$this -> nombreEmpresa = $emp['nombre'] ;
			}else{
				$this -> nombreEmpresa = 'NotFound: '.$id;
			}
		}else{
			$this -> nombreEmpresa = 'Todas';
		}
	}


	/*
		Devuelve el id del objeto permiso
	*/
	private function getPermisoId(){
		if ($this->accion == '1')
			return ($this->permId['Ver']);
		elseif ($this->accion == '2')
			return ($this->permId['Editar']);
		elseif 	($this->accion == '3')
			return ($this->permId['Crear']);
	}

	/*
		inserta una nueva autorizacion si no existe,
		e inserta el nuevo permisoAutorizacion si no existe
	*/
	public function upsertPermiso($em){

		$this->setPermisosIds($em);
		$permiso = new Permiso();
		$autorizacion = new Autorizacion();
		$permisoAutorizacion = new PermisoAutorizacion();
		
		if ($this->objeto != 'Incidente')
			$this -> campo = 'ALL';
		
		//get permiso id
		$permisoAutorizacion->setPermiso($this->getPermisoId());

		//get empresa id
		if ($this->empresa == NULL){
			$this->empresa = 'ALL';
		}else{
			$this->empresa = $this->empresa->getId();
		}

		//insert and/or get autorizacion id
		$autorizacion->setCampo($this -> campo);
		$autorizacion->setObjeto($this -> objeto);
		$autorizacion->setEmpresa($this -> empresa);


		
		//chequear autorizacion no existente
		$resu = $em -> createQuery('SELECT a
										FROM CHOMPSGIBundle:Autorizacion a
									   WHERE a.campo = :ca
									     AND a.objeto = :ob
									     AND a.empresa = :e'
									) -> setParameter('ca', $this->campo) -> setParameter('ob', $this->objeto) -> setParameter('e', $this->empresa) ->getResult();
		
		//si ya existe
		if ($resu != null){
			foreach($resu as $aut)
				$autorizacion = $aut;
		}else{
			//no existe, crearla.
			try{
				$em->persist($autorizacion);
				$em->flush();
			}catch(Exception $e){
				return;
			}
		}	
		
		$permisoAutorizacion->setAutorizacion($autorizacion);
		
		//insertar permisoAutorizacion
		$em->getRepository('CHOMPSGIBundle:PermisoAutorizacion')->upsert($permisoAutorizacion);
		
	}

}

?>